import adminListView from '$v/adminList' //引入adminList视图

import {
  addAdminRequest, //添加管理员的ajax请求
  adminListRequest, //查询管理员的ajax请求 
  deleteAdminRequest, //删除管理员的ajax请求
  isLoginRequest //判断权限的请求
} from '$a/admin';


//封装展示所有管理员列表的功能函数,当初始化的时候,添加的时候,删除的时候都要执行
const showAdminList = async (res) => {

  let adminListResult = null;
  try {
    adminListResult = await adminListRequest();
    console.log(adminListResult.data);
  } catch (e) {
    alert("获取管理员列表异常:" + e.message)
  }

  //渲染二级路由视图
  res.render(adminListView({
    adminList: adminListResult.data
  }));

}


export default async (req, res) => {
  //路由切换的时候验证登录
  try {
    await isLoginRequest();
  } catch (e) {
    //请求异常后提示用户
    alert("有异常" + e.message)

    //判断是否是权限异常 没有token权限就跳到登录页面
    if (!e.isLogin) {
      return router.go("/login");
    }

  }


  //只要进入当前路由函数，则立马开始查询所有的管理员信息并渲染页面展示管理员列表 传入res作为参数使用
  //因为showAdminList函数是异步的 所以 给保存按钮绑定点击事件是在渲染页面之前绑定的，在渲染页面之前是
  //  找不到这个按钮的，所以我们必须等这个函数执行完把页面渲染出来了才能给保存按钮绑定点击事件！！！！！
  await showAdminList(res);

  //在sem路由中,在路由的回调函数中可以获取整个document,所以我们可以在这个位置操作DOM

  //添加管理员功能：
  //给保存按钮绑定点击事件,添加管理员
  // const oSaveAdminBtn = document.getElementById('saveAdminBtn');//事件委派后不需要给保存按钮绑定事件了

  //使用事件委托绑定事件,因为将来部分视图会重新渲染,如果给重新渲染的元素绑定事件,事件在重新渲染之后可能会失效
  document.onclick = async function (e) {
    //当点击的是保存按钮的时候执行添加管理员逻辑  添加成功重新渲染页面
    if (e.target.id === "saveAdminBtn") {
      //可以通过表单元素的name属性获取某个元素
      // console.log(document.adminForm);
      // console.log(document.adminForm.adminName);
      // console.log(document.adminForm.password);
      // console.log(document.adminForm.rePassword);
      //获取用户输入的内容
      const adminNameValue = document.adminForm.adminName.value.trim();
      const passwordValue = document.adminForm.passWord.value.trim();
      const rePasswordValue = document.adminForm.rePassWord.value.trim();

      //判断所有的输入不能为空
      if (!adminNameValue || !passwordValue || !rePasswordValue) {
        return alert("输入内容不能为空!!!!");
      }

      //判断密码是否一致
      if (passwordValue !== rePasswordValue) {
        return alert("两次输入的密码不一致")
      }

      //向后端发送添加管理员请求
      try {
        await addAdminRequest({
          adminName: adminNameValue,
          password: passwordValue,
          regTime: new Date().toLocaleString()
        })

        alert("添加成功")
        //添加成功之后,管理添加窗口(手动触发某个元素上的点击事件)
        document.getElementById('closeAdd').click();
        //清空表单
        document.adminForm.reset();


        //重新渲染页面
        showAdminList(res);


      } catch (e) {
        //请求异常后提示用户
        alert("有异常" + e.message)
        //清空表单
        document.adminForm.reset();
        //判断是否是权限异常 没有token权限就跳到登录页面
        if (!e.isLogin) {
          //关闭添加管理员的弹窗再跳转
          document.getElementById("closeAdminBtn").click();
          return router.go("/login");
        }


      }
    }

    //当点击的是删除按钮的时候执行删除管理员逻辑  删除成功重新渲染页面
    if (e.target.nodeName === 'BUTTON' && e.target.parentNode.nodeName === 'TD') {
      //获取当前删除按钮对应的adminName(在生成删除按钮的时候 就把自定义属性设置上去)
      const adminname = e.target.dataset.adminname;

      //给删除按钮一个提示
      const re = confirm('删除管理员(不要动admin!!!,其他随便)')
      if(!re){
        return
      }

      try {
        //发送删除管理员请求
        const deleteResult = await deleteAdminRequest(adminname);
        alert(deleteResult.msg);


        //删除成功重新渲染页面
        showAdminList(res);

      } catch (e) {
        alert("删除管理员" + adminName + "失败")
        //判断是否是权限异常 没有token权限就跳到登录页面
        if (!e.isLogin) {
          return router.go("/login");
        }

      }
    }

  }

}